Estoy usando AWS para mi sitio web. Después de 1 hora, el token caduca y el usuario prácticamente no puede hacer nada.
Por ahora estoy tratando de actualizar las credenciales de esta manera:
function getTokens(session) { return { accessToken: session.getAccessToken().getJwtToken(), idToken: session.getIdToken().getJwtToken(), refreshToken: session.getRefreshToken().getToken() }; }; function getCognitoIdentityCredentials(tokens) { const loginInfo = {}; loginInfo[`cognito-idp.eu-central-1.amazonaws.com/eu-central-1_XXX`] = tokens.idToken; const params = { IdentityPoolId: AWSConfiguration.IdPoolId Logins: loginInfo }; return new AWS.CognitoIdentityCredentials(params); }; if(AWS.config.credentials.needsRefresh()) { clearInterval(messwerte_updaten); cognitoUser.refreshSession(cognitoUser.signInUserSession.refreshToken, (err, session) => { if (err) { console.log(err); } else { var tokens = getTokens(session); AWS.config.credentials = getCognitoIdentityCredentials(tokens); AWS.config.credentials.get(function (err) { if (err) { console.log(err); } else { callLambda(); } }); } }); }la cuestión es que, después de 1 hora, el token de inicio de sesión se actualiza sin problemas, pero después de 2 horas ya no puedo actualizar el token de inicio de sesión.
También intenté usar AWS.config.credentials.get() , AWS.config.credentials.getCredentials() y AWS.config.credentials.refresh() que tampoco funciona.
Los mensajes de error que recibo son:
Faltan credenciales en la configuración
Token de inicio de sesión no válido. Ficha caducada: 1446742058 >= 1446727732
Después de casi 2 semanas finalmente lo resolví.
Necesita el token de actualización para recibir un nuevo token de identificación. Una vez que se adquiere el token actualizado, actualice el objeto AWS.config.credentials con el nuevo token de identificación.
aquí hay un ejemplo de cómo configurar esto, ¡funciona sin problemas!
refresh_token = session.getRefreshToken(); // you'll get session from calling cognitoUser.getSession() if (AWS.config.credentials.needsRefresh()) { cognitoUser.refreshSession(refresh_token, (err, session) => { if(err) { console.log(err); } else { AWS.config.credentials.params.Logins['cognito-idp.<YOUR-REGION>.amazonaws.com/<YOUR_USER_POOL_ID>'] = session.getIdToken().getJwtToken(); AWS.config.credentials.refresh((err)=> { if(err) { console.log(err); } else{ console.log("TOKEN SUCCESSFULLY UPDATED"); } }); } }); }Por lo general, se resuelve interceptando solicitudes http con lógica adicional.
function authenticationExpiryInterceptor() { // check if token expired, if yes refresh } function authenticationHeadersInterceptor() { // include headers, or no }}luego con el uso de la capa HttpService
return HttpService.get(url, params, opts) { return authenticationExpiryInterceptor(...) .then((...) => authenticationHeadersInterceptor(...)) .then((...) => makeRequest(...)) }También podría resolverse por proxy http://2ality.com/2015/10/intercepting-method-calls.html
En relación con AWS:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Credentials.html
Estás interesado en:
Así es como implementé esto:
Primero debe autorizar al usuario al servicio y otorgar permisos:
Solicitud de muestra:
Así es como implementé esto:
Primero debe autorizar al usuario al servicio y otorgar permisos:
Solicitud de muestra:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token& Content-Type='application/x-www-form-urlencoded'& Authorization=Basic aSdxd892iujendek328uedj grant_type=authorization_code& client_id={your client_id} code=AUTHORIZATION_CODE& redirect_uri={your rediect uri}Esto devolverá un Json algo como:
HTTP/1.1 200 OK Tipo de contenido: aplicación/json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je","id_token":"dmcxd329ujdmkemkd349r", "token_type":"Bearer", "expires_in":3600}Ahora necesita obtener un token de acceso según su alcance:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token Content-Type='application/x-www-form-urlencoded'& Authorization=Basic aSdxd892iujendek328uedj grant_type=client_credentials& scope={resourceServerIdentifier1}/{scope1} {resourceServerIdentifier2}/{scope2}Json sería:
HTTP/1.1 200 OK Tipo de contenido: aplicación/json
{"access_token":"eyJz9sdfsdfsdfsd", "token_type":"Bearer", "expires_in":3600}Ahora, este token de acceso solo es válido durante 3600 segundos, después de lo cual debe intercambiarlo para obtener un nuevo token de acceso. Para hacer esto,
Para obtener un nuevo token de acceso desde el token de actualización:
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token > Content-Type='application/x-www-form-urlencoded' Authorization=Basic aSdxd892iujendek328uedj grant_type=refresh_token& client_id={client_id} refresh_token=REFRESH_TOKENRespuesta:
HTTP/1.1 200 OK Tipo de contenido: aplicación/json
{"access_token":"eyJz9sdfsdfsdfsd", "refresh_token":"dn43ud8uj32nk2je", "id_token":"dmcxd329ujdmkemkd349r","token_type":"Bearer", "expires_in":3600}Obtienes la imagen correcta.
Si necesitas más detalles entra aquí .